컴퓨터과학
어셈블리_02_x86-64 아키텍처와 레지스터
작성자 : Heehyeon Yoo|2025-10-07
# Assembly# CPU# Register# x86-64
CPU는 메모리(RAM)에 비해 압도적으로 빠른 처리 속도를 가진다. 따라서 연산에 필요한 데이터를 매번 메모리에서 가져오는 것은 비효율적이다. 이를 해결하기 위해 CPU 내부에는 레지스터(Register)라는 초고속 저장 공간이 존재한다. 어셈블리어 프로그래밍의 핵심은 이 레지스터를 효율적으로 관리하고 조작하는 것이다.
1. 범용 레지스터 (General Purpose Registers)
x86-64 아키텍처에는 다양한 레지스터가 존재하지만, 리버스 엔지니어링 수행 시 반드시 숙지해야 할 주요 레지스터는 다음과 같다.
| 레지스터 | 역할 및 설명 |
|---|---|
| RAX | Accumulator. 산술 연산 결과 및 함수 리턴값(Return Value) 저장. |
| RDI | Destination Index. 함수 호출 시 첫 번째 인자(1st Argument) 전달. |
| RSI | Source Index. 함수 호출 시 두 번째 인자(2nd Argument) 전달. |
| RDX | Data. 함수 호출 시 세 번째 인자(3rd Argument) 전달. |
| RCX | Counter. 반복문의 카운터로 사용되며, 네 번째 인자 전달에도 사용됨. |
| RIP | Instruction Pointer. 다음에 실행될 명령어의 주소를 가리킴. 임의 조작 시 프로그램 흐름이 바뀜.(현재 실행 중인 명령어가 아님에 주의) |
| RSP | Stack Pointer. 스택 메모리의 최상단 주소를 가리킴.(물이 가득 찬 컵의 수면 높이라고 이해하면 된다. 물을 더 부으면 수면이 올라가듯, 데이터가 쌓이면 RSP가 이동한다.) |
초기 학습 단계에서는 위 레지스터들의 역할만 명확히 이해해도 충분하다.
2. 레지스터의 분할 사용과 Zero Extension
64비트 레지스터(RAX)는 필요에 따라 하위 32비트(EAX), 16비트(AX), 8비트(AL)로 쪼개서 사용할 수 있다. 이는 과거 32비트(x86) 및 16비트 시절 코드와의 호환성을 위함이다.
중요한 점은 32비트 연산 시의 동작이다.
MOV EAX, 0과 같이 하위 32비트에 값을 쓸 경우, CPU는 자동으로 상위 32비트를 0으로 초기화(Zero Extension)한다. 반면, 8비트나 16비트 연산 시에는 상위 비트가 보존된다. 이러한 동작 차이는 버그나 취약점 분석 시 중요한 단서가 된다.